package modelo.servicio;

import java.util.List;
import modelo.bd.dao.CondicionanteDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Condicionante;

public class Condicionantes {

    private static Condicionantes instancia;
    private CondicionanteDAO dao;

    private Condicionantes() {
        this.dao = new CondicionanteDAO();
    }

    public static Condicionantes instancia() {
        if (instancia == null) {
            instancia = new Condicionantes();
        }
        return instancia;
    }

    public void agregar(Condicionante cond)
            throws DAOException {
        dao.add(cond);
    }

    @Override
    protected Object clone()
            throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar CondicionanteS.");
    }

    public Condicionante obtenerPorId(Integer idCond)
            throws DAOException {
        return dao.selectWhere("ID_CONDICIONANTE=" + idCond).get(0);
    }

    public Condicionante obtenerUltimo()
            throws DAOException {
        return dao.selectWhere("ID_CONDICIONANTE = IDENT_CURRENT('SSMA_CONDICIONANTES_T')").get(0);
    }

    public void actualizar(Condicionante cond)
            throws DAOException {
        dao.update(cond);
    }
//

    public List<Condicionante> obtenerConocimiento(Integer area)
            throws DAOException {
        String cond = " RESPONSABLE IS NULL "
                + " AND CLAVE_DOC IN (SELECT CLAVE_DOC FROM SSMA_DOCUMENTOS_T WHERE ID_SECCION IN "
                + " (SELECT ID_SECCION FROM SSMA_SECCIONES_T WHERE ID_AREA = " + area + " ))";
        return dao.selectWhere(cond);
    }

    public List<Condicionante> obtenerPorDoc(String clv)
            throws DAOException {
        String cond = " CLAVE_DOC = '" + clv + "'";
        return dao.selectWhere(cond);
    }

    public List<Condicionante> obtenerCumplimientoUnico(Integer area)
            throws DAOException {
        String cond = " RESPONSABLE IS NOT NULL AND PERIODICIDAD IS NULL AND DURACION IS NULL "
                + " AND CLAVE_DOC IN (SELECT CLAVE_DOC FROM SSMA_DOCUMENTOS_T WHERE ID_SECCION IN "
                + " (SELECT ID_SECCION FROM SSMA_SECCIONES_T WHERE ID_AREA = " + area + " ))";
        return dao.selectWhere(cond);
    }

    public List<Condicionante> obtenerCumplimientoPeriodico(Integer area)
            throws DAOException {
        String cond = " RESPONSABLE IS NOT NULL AND PERIODICIDAD IS NOT NULL AND DURACION IS NOT NULL "
                + " AND CLAVE_DOC IN (SELECT CLAVE_DOC FROM SSMA_DOCUMENTOS_T WHERE ID_SECCION IN "
                + " (SELECT ID_SECCION FROM SSMA_SECCIONES_T WHERE ID_AREA = " + area + " ))";
        return dao.selectWhere(cond);
    }

    public List<Condicionante> obtenerFiltrado(Integer area, String numero, Integer seccion, String tipo, String tipo2, String desde, String hasta)
            throws DAOException {
        String cond = " CLAVE_DOC IN (SELECT CLAVE_DOC FROM SSMA_DOCUMENTOS_T WHERE ID_SECCION IN "
                + " (SELECT ID_SECCION FROM SSMA_SECCIONES_T WHERE ID_AREA = " + area + " ))"
                + (numero == null || numero.equals("") ? "" : " AND NUMERO = '" + numero + "' ")
                + (seccion == 0 ? "" : " AND CLAVE_DOC IN (SELECT CLAVE_DOC FROM SSMA_DOCUMENTOS_T WHERE ID_SECCION IN "
                + "( SELECT ID_SECCION FROM SSMA_ARBOL_SECCIONES_F(" + seccion + ")))")
                //+ (seccion == 0 ? "" : " AND NUMERO = " + seccion)
                + (tipo == null ? "" : " AND TIPO = '" + tipo + "' ");
        if (tipo2 != null) {
            if (tipo2.equalsIgnoreCase("CN")) {
                cond += " AND RESPONSABLE IS NULL ";
            } else if (tipo2.equalsIgnoreCase("CU")) {
                cond += " AND RESPONSABLE IS NOT NULL AND PERIODICIDAD IS NULL AND DURACION IS NULL ";
            } else if (tipo2.equalsIgnoreCase("CP")) {
                cond += " AND RESPONSABLE IS NOT NULL AND PERIODICIDAD IS NOT NULL AND DURACION IS NOT NULL ";
            }
        }
        if (!desde.equals("") && !hasta.equals("")) {
            cond += " AND FECHA IS NOT NULL AND FECHA BETWEEN CONVERT(DATETIME,'" + desde + "',103) "
                    + " AND CONVERT(DATETIME,'" + hasta + "',103)";
        }
        return dao.selectWhere(cond);
    }

    public void eliminar(Integer idCond) throws DAOException {
        Condicionante cond = obtenerPorId(idCond);
        cond.getHistorico().setEstado("IN");
        dao.update(cond);
    }
    /*
     * 1.- #numero 2.- Seccion 3.- subseccion 4.- Termino o condicionante 5.-
     * fechas: desde - hasta
     */
}
